#!/bin/bash

:<<EOF
这是加密文件的工具脚本
通过tar命令配合openssl的salt加密
EOF

# 定义选项字典变量
declare -A opt
# 定义脚本短选项
short_opt="f:k:s:"
# 定义脚本长选项
long_opt="enfile:,enckey:,savedir:"
# 设置脚本选项默认值
opt=([k]='molio@123' [s]=$PWD/)

# 删除源文件
del_file() {
    read -p "是否删除源文件$1(yes/no)?: " flag
    case $flag in
        y|yes)
            rm $1
            ;;
        n|no|*)
            echo "为了数据安全,请及时删除源文件$1"
            ;;
    esac
}

# 加密
run_encf() {
    test -e ${opt[f]} || err_exit "请指定加密/解密文件" 0
    tar -zcf - ${opt[f]} | openssl des3 -salt -k ${opt[k]} | \
        dd of=${opt[s]}/${opt[f]}.des3
    del_file ${opt[f]}
}

# 解密
run_decf() {
    test -e ${opt[f]} || err_exit "请指定加密/解密文件" 0
    dd if=${opt[f]} | openssl des3 -d -k ${opt[k]} | tar -zxf - -C ${opt[s]}
    del_file ${opt[f]}
}

# 错误退出
err_exit() {
    echo $1
    exit $2
}

help_show() {
    cat << EOF
使用样例
    加密
        enfile encf -f /tmp/a.txt -k 123 -s /tmp
    解密
        enfile decf -f /tmp/a.txt.des3 -k 123 -s /tmp
EOF
}

parse_args() {
    GETOPT_ARGS=$(getopt -o $short_opt -al $long_opt -- "$@")
    eval set -- "$GETOPT_ARGS"

    while test -n "$1" ; do
        case "$1" in
            -f|--enfile) opt[f]=$2; shift 2;;
            -k|--enckey) opt[k]=$2; shift 2;;
            -s|--savedir) opt[s]=$2; shift 2;;
            *) break ;;
        esac
    done
    args="$@"
}

# 过滤第一,二个参数
scriptfile=$0
cmd="$1"
grep -qw -e "$cmd" <<< "encf|decf|help" && shift
parse_args "$@"

echo "$cmd"
echo "$args"

case "$cmd" in
    encf)
        run_encf $args
        ;;
    decf)
        run_decf $args
        ;;
    help|*)
        help_show
        ;;
esac
